package middleware

//import (
//	"encoding/json"
//	"net/http"
//	"strings"
//	"time"
//
//	"zhiyun-tech.com/servers/pkg/utils"
//
//	"github.com/gin-gonic/gin"
//	"zhiyun-tech.com/servers/apps/common/http/errcode"
//	"zhiyun-tech.com/servers/pkg/logger"
//)
//
//type Cache interface {
//	Get(key string) (string, error)
//	Set(key string, value interface{}, expiration time.Duration) (string, error)
//}
//
////	缓存Get接口页面数据,如果query参数包含userid或时间戳等动态参数，请不要使用本中间件。
////	生成的最终redis可以规则为： prefix+"_"+strings.join(keys,"_"),如果keys为空则以prefix+"_"+strings.ReplaceAll(strings.TrimSpace(c.Request.RequestURI), "\n", "")。 \
////	prefix为前缀值，可以为空。
////	example: middleware.CacheGet(myredis.Redis, 60*5, "column", "column_id_page_num_page_size")
//func CacheGet(cc Cache, timeout int, prefix string, keys ...string) gin.HandlerFunc {
//	return func(c *gin.Context) {
//		if c.Request.Method != "GET" {
//			logger.Log.Warnln("非Get接口使用了cache：", c.Request.URL.String())
//			c.Next()
//			return
//		}
//
//		key := ""
//		if len(keys) == 0 {
//			//空格或者换行符"\n"（空格和换行符是redis的特殊字符)
//			key = strings.TrimSpace(c.Request.RequestURI)
//			key = strings.ReplaceAll(key, "\n", "")
//			key = prefix + "_" + key
//		} else {
//			queries := make([]string, 0)
//			queries = append(queries, prefix)
//			for i := 0; i < len(keys); i++ {
//				queries = append(queries, c.Query(keys[i]))
//			}
//			key = strings.Join(queries, "_")
//		}
//		if key == "" {
//			c.Next()
//			return
//		}
//		st := time.Now()
//		//从缓存读取
//		value, err := cc.Get(key)
//		if err == nil {
//			//cache读取到数据
//			//c.String(http.StatusOK, value)
//			var m0 map[string]interface{}
//			err = json.Unmarshal([]byte(value), &m0)
//			if err == nil {
//				//解析成功了
//				for k, v := range m0 {
//					c.Set(k, v)
//				}
//				c.Set("errcode", errcode.SUCCESS)
//				c.Set("errmsg", "success")
//				c.Set("ts", utils.FmtUsedTime(st))
//				params := c.Keys
//				//logger.Println("cache get:", key)
//				c.JSON(http.StatusOK, params)
//				c.Abort()
//				return
//			}
//			logger.Log.Warnln("cache value Unmarshal err：", err)
//		}
//		//cache没有找到数据
//		c.Next()
//		if c.Writer.Status() != http.StatusOK && c.Writer.Status() != 0 {
//			//接口不是处理成功的
//			return
//		}
//		errcd, ok := c.Keys["errcode"]
//		if ok && errcd != errcode.SUCCESS {
//			//接口不是处理成功的
//			return
//		}
//		//写入缓存
//		// 当前登录用户信息
//		delete(c.Keys, "$user")
//		params := c.Keys
//		b, err := json.Marshal(params)
//		if err != nil {
//			logger.Log.Warnln("cache value Marshal params err：", err)
//			return
//		}
//		_, err = cc.Set(key, string(b), time.Duration(timeout)*time.Second)
//		if err != nil {
//			logger.Log.Warnln("cache value Set err：", err)
//			return
//		}
//		logger.Println("write cache success:", key)
//	}
//}
